package com.misyi.designpattern.proxy;

/**
 * 代理模式
 *
 * @author licong
 * @date 2021-09-13 下午10:42
 */
public class ProxyPatternDemo {

    public static void main(String[] args) {
        ProxySubject proxySubject = new ProxySubject();
        proxySubject.request();
        // 代理模式: 代理类和被代理的类实际上实现的是同一接口, 最终实现的是同一功能
        // 只是代理类针对原有类做了一些强化, 在目标对象调用之前做了一些额外的事情
        // mybatis 的懒加载\ rpc 调用包, 都是使用了代理模式

        // 代理和真实对象之间的的关系通常在编译时就已经确定了
        // 代理模式关注于控制对对象的访问
    }


    public interface Subject {
        void request();
    }

    public static class SubjectImpl implements Subject {

        @Override
        public void request() {
            System.out.println("执行功能");
        }
    }

    public static class ProxySubject implements Subject{

        private Subject subject;

        public ProxySubject() {
            this.subject = new SubjectImpl();
        }

        @Override
        public void request() {
            System.out.println("执行额外的条件判断, 考虑是否需要调用subject的request()方法");
            boolean invoke = true;
            if (invoke) {
                subject.request();
            }
        }
    }

}
